StupidBeauty
Read times:1737Posted at:Sat Oct 12 21:07:39 2013
- no title specified

iOS开发文档翻译:核心数据编程指南/核心数据基础,Core Data Programming Guide/Core Data Basics

Core Data基础

此文章说明的是 Core Data 的基本架构,以及妳如何使用此框架。

基本的Core Data 架构

在大多数程序中,妳都需要一种手段来打开一个储存了多个对象信息的文件,并且最少引用到其中的一个根对象。妳还需要能够将所有对象都保存到一个文件中去并且—假设妳想要支持撤销功能的话—跟踪这些对象的变更情况。例如,在一个雇员管理程序中,妳需要一种手段来打开一个储存有雇员和部门对象信息的文件,并且最少引用到一个根对象—比如说所有雇员所组成的数组—此情景在图 1中展示。妳还需要将所有雇员和部门的信息都保存到一个文件中去。

注意:此文档使用雇员信息作为示例,是为了方便和清晰地举例。它展现了一种比较复杂但是又狠容易理解的问题领域。然而,Core Data 这个框架的功能,并不仅限于用于数据库类型的程序,也并不预期妳的程序中会存在一种客户端-服务器架构的行为。此框架的用处与一个矢量绘图程序(例如Sketch)或一个演示程序(例如Keynote)所用到的基础框架是等同的。

妳需要编写用于管理这些任务的部分或全部代码。例如,在OS X 桌面上,可可(Cocoa)的文档架构模块提供了一个程序结构和相关功能,能够帮助妳减轻工作量,但妳仍然需要编写一些方法代码来支持以下功能:对数据进行编码(archiving)及解码(unarchiving);跟踪模型对象的变更;与一个撤销管理器交互以支持撤销功能。

图 1 使用标准的可可文档架构实现的文档管理

使用Core Data 框架时,这里的大部分功能都是通过一个叫做被管理对象上下文managed object context)(或直接称之为“上下文”)的对象来自动提供给妳的。这个被管理对象上下文,充当着妳与一组底层框架对象之间的桥梁(gateway)—这组框架对象总称为持久化栈persistence stack —它们将妳程序中的那些对象与外部的数据存储对应起来。这个栈的底部就是持久化对象存储persistent object stores),见图 2

图 2 使用Core Data进行文档管理

Core Data的功能并不仅限于基于文档的程序—事实上完全可以创建一个不带用户界面的基于Core Data的工具(参考Core Data工具教程)。这于其它类型的程序,这一点也成立。

被管理的对象和上下文

妳可以将被管理对象上下文想象成一个智能的涂鸦板(scratch pad)。当妳从一个持久化存储中获取到对象时,就是将这些对象的临时副本放置到该涂鸦板上了,它们在涂鸦板上形成一个对象图(或者一组对象图)。然后妳可以随意修改那些对象。除非妳将这些变更保存起来,否则,持久化存储中的信息就会保持不变。

Core Data 框架中的那些模型对象被称作被管理的对象managed objects)。所有的被管理对象都必须注册到一个被管理对象上下文中。妳使用该上下文来对该图做添加对象或删除对象的操作。该上下文会跟踪妳所做出的那些变更,包括单个对象的属性的变更和多个对象之间的关系变更。通过跟踪变更,该上下文就能为妳提供撤销和重做支持。它还能确保,当妳改变不同对象之间的关系时,整个对象图保持其完整性。

当妳想要保存妳所作出的变更时,该上下文会确保妳的那些对象都处于一个有效的状态。如果它们确实处于一个有效状态,则,所作出的变更会被保存到持久化存储中,针对妳创建的新对象会加入新的记录,针对妳删除的对象会删除其记录。

妳可以在自己的程序中使用多个被管理对象上下文。对于一个持久化存储中的每个对象,在指定的上下文中最多只能有一个对应的被管理对象(参考“容错和唯一性”,以了解更多细节)。换个角度来说,一个持久化存储中的某个指定对象,可能会在多个上下文中同时被编辑。然后,在每个上下文中,都有它自己的一个被管理对象对应着这个源对象,并且每个被管理对象都可以独立地被编辑。这就有可能在保存时破坏数据一致性—Core Data提供了多种手段来处理这种情况(例如,参考“使用 被管理对象 )。

取信息请求

要想使用一个被管理对象上下文来获取数据,就要创建一个取信息请求fetch request)。取信息请求是一个对象,它指定了妳想要的数据,例如,“所有雇员”,或“市场部的所有雇员,按照工资排序,从高到低”。一个取信息请求拥有三个部分。它最少需要指定一个实体的名字(由此推出,妳一次只能获取到一种实体)。它还可能包含:一个断言对象,指定了那些对象必须满足的条件;一个数组,其中包含了一些排序条件描述对象,它们指定了这些对象应当按照什么顺序出现。这些东西在图 3中说明。

图 3 一个取信息请求示例

妳将一个取信息请求发送给一个被管理对象上下文,它会返回与它的持久化存储所关联的数据源中符合妳的请求的那些对象(有可能是空的)。由于所有的被管理对象都必须注册到一个被管理对象上下文,所以,从一个取信息请求中返回的对象都会自动注册到妳用来取信息的上下文中。但是,再强调一遍,对于一个持久化存储中的每个对象,它在某个指定的上下文中最多能够拥有一个相关联的被管理对象(参考“容错及唯一性”)。如果,对于某个对象,在一个上下文中已经从之前的取信息请求中产生了一个与之对应的被管理对象,则,在之后的取信息请求中,对于这个对象会返回已存在的被管理对象

此框架会尽可能地提高效率。Core Data是由需求驱动的,所以妳不需要创建超出妳的需要的数量的对象。对象图不需要表示出对应的持久化存储中的所有对象。简单地指定一个持久化存储并不会将任何数据对象带入到被管理对象上下文中去。当妳从持久化存储中获取到一部分对象时,妳只会获取到妳所要求的那些对象。如果妳跟踪着对象之间的关系,访问到了一个之前未被获取到的对象,则该对象会被自动为妳获取。当妳停止使用某个对象时,默认情况下它会被从内存中释放掉。(当然,这与将它从对象图中删除是不一样的。)

持久化存储协调器

之前说明过,在妳的程序中的对象和外部数据存储之间的那些框架对象,统称为持久化栈。在栈的顶部是被管理对象上下文,在栈的底部是持久化对象存储。在被管理对象上下文与持久化对象存储之间的是持久化存储协调器persistent store coordinator)。

从效果上来讲,一个持久化存储协调器定义了一个栈。这个协调器被设计为向被管理对象上下文提供了一个接口,使得一组持久化存储能够呈现为一个单一的聚合存储。因此,一个被管理对象上下文可以基于该协调器所组合起来的所有数据存储来创建一个对象图。一个协调器只能与一个被管理对象模型关联。如果妳想要将不同的实体信息放置到不同的存储中去,则,妳必须在被管理对象模型中定义配置文件,以将妳的模型实体分割开(参考“配置”)。

图 4展示了一个场景,其中,雇员和部门信息储存在一个文件中,顾客和公司信息储存在另一个文件中。当妳获取对象时,它们会自动从正确的文件中获取,当妳保存信息时,它们会被保存到正确的文件中。

图 4 高级的持久化栈

持久化存储

一个给定的持久化对象存储,是与一个单个文件或别的外部数据存储关联的,它最终负责将那个存储中的数据与一个被管理对象上下文中的对象对应起来。一般情况下,妳唯一会与一个持久化对象存储打交道的时候就是,指定一个新的外部数据存储的位置以将它与妳的程序关联起来(例如,用户打开或保存一个文档)。与Core Data 框架的其它大部分交互都是通过被管理对象上下文来做的。

妳的程序代码—尤其是与被管理对象相关的程序逻辑代码—不应当就数据会被存储于何种类型的持久化存储之中这件事做任何的假设。Core Data对多种文件格式提供了原生的支持。妳可以根据程序的需求来选择使用哪种格式。即使在某个阶段妳决定选择使用一种不同的文件格式,妳的程序架构也应当保持不变。而且,如果妳的程序是被适当地抽象了,那么,妳应当可以在不需要做任何修改的情况下就享受该框架在之后版本的改进中所带来的好处。例如—即使在最初的实现中只能从本地文件系统中获取记录信息—但是,如果一个程序不对数据的来源做任何假设的话,则,当此框架之后加入了对一种新的远端持久化存储的支持的时候,这个程序应当无需做任何修改就能够利用到这种新的存储类型了。

重要:尽管Core Data支持将SQLite 作为它的一种持久化存储类型,但是,Core Data无法用来管理其它的任意的SQLite 数据库。要想使用一个SQLite 数据库,Core Data 必须亲自创建及管理该数据库。要了解更多关于存储类型的信息,参考“持久化存储特性”

持久化文档

妳可以通过代码来创建及配置持久化栈。然而,在狠多情况下,妳只想要创建一个能够读取及写入文件的基于文档的程序。NSPersistentDocument类是一 NSDocument 个子类,它被设计用来让妳轻松地使用Core Data 框架。默认情况下,一个NSPersistentDocument实例会创建它自己的可直接使用的持久化栈,其中包括一个被管理对象上下文和一个单个持久化对象存储。在这种情况下,文档与外部数据存储之间是一对一的关系。

NSPersistentDocument类提供了方法可用来访问该文档的被管理对象上下文,还提供了标准NSDocument 方法的实现,它们会使用Core Data 框架来读写文件。默认情况下,妳不需要写任何代码来处理对象的持久化过程。一个持久化文档的撤销功能是与被管理对象上下文整合在一起的。

被管理对象和被管理对象模型

为了能够管理好对象图并且支持对象的持久化,Core Data需要拥有对于它所操作的对象的充分描述。一个被管理对象模型( managed object model 是一个模式(schema),它提供了在妳的程序中要使用的被管理对象或实体的描述,见图 5。常规做法是使用Xcode的数据建模设计(Data Model Design)工具来以图形化界面创建及管理对象模型。(如果妳愿意的话也可以在运行时直接使用代码来构造这个模型。)

图 5 拥有两个实体的被管理对象模型

模型由一组实体描述对象组成,其中每个对象都提供了对于某个实体的元数据,包括:实体的名字、在妳的程序中代表该实体的类的名字(不需要与实体的名字一致)、它的属性和关系。而属性和关系又是由属性和关系描述对象来表示的,见图 6

图 6 拥有两个属性和一个关系的实体描述

被管理对象必须是一个NSManagedObject NSManagedObject 子类的实例。NSManagedObject可表示任何实体。它使用一个私有的内部存储来维护它的属性,并且实现了一个被管理对象所必需的所有基本行为。一个被管理对象拥有着它作为其实例的那个实体的实体描述的一个引用。它引用该实体描述,是为了发现与自身相关的元数据,包括:它所表示的实体的名字、它的属性和关系。妳还可以创建NSManagedObject 的子类,以实现附加的行为。

办公室女郎

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4